/**
  ******************************************************************************
  * @file        
  * @author      古么宁
  * @brief       链表文件，实现相关数据结构及其操作
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 GoodMorning
  *
  ******************************************************************************
  */
#ifndef _IEC_LIST_H_
#define _IEC_LIST_H_



/* Global  types ------------------------------------------------------------*/
/// 双向链表节点
struct iec_list {
	struct iec_list *next, *prev;
};

/// 单链表
struct iec_slist {
	struct iec_slist *next ;
};


/* Global  macro ------------------------------------------------------------*/

/* Global  variables --------------------------------------------------------*/

/* Global  function prototypes ----------------------------------------------*/


// 初始化节点：将list节点的前继节点和后继节点都是指向list本身。
static inline void init_iec_list(struct iec_list *list)
{
	list->next = list;
	list->prev = list;
}


// 添加节点：将new插入到prev和next之间。
static inline void __iec_list_add(struct iec_list *new,
                  struct iec_list *prev,
                  struct iec_list *next)
{
    next->prev = new;
    new->next = next;
    new->prev = prev;
    prev->next = new;
}

// 添加new节点：将new添加到head之后，是new称为head的后继节点。
static inline void iec_list_add_head(struct iec_list *new, struct iec_list *head)
{
    __iec_list_add(new, head, head->next);
}

// 添加new节点：将new添加到head之前，即将new添加到双链表的末尾。
static inline void iec_list_add_tail(struct iec_list *new, struct iec_list *head)
{
    __iec_list_add(new, head->prev, head);
}

// 从双链表中删除entry节点。
static inline void __iec_list_del(struct iec_list * prev, struct iec_list * next)
{
    next->prev = prev;
    prev->next = next;
}

// 从双链表中删除entry节点。
static inline void iec_list_del(struct iec_list *entry)
{
    __iec_list_del(entry->prev, entry->next);
}

// 从双链表中删除entry节点。
static inline void __iec_list_del_entry(struct iec_list *entry)
{
    __iec_list_del(entry->prev, entry->next);
}

// 从双链表中删除entry节点，并将entry节点的前继节点和后继节点都指向entry本身。
static inline void iec_list_del_init(struct iec_list *entry)
{
    __iec_list_del_entry(entry);
    init_iec_list(entry);
}

// 用new节点取代old节点
static inline void iec_list_replace(struct iec_list *old,
                struct iec_list *new)
{
    new->next = old->next;
    new->next->prev = new;
    new->prev = old->prev;
    new->prev->next = new;
}

// 双链表是否为空
static inline int iec_list_empty(const struct iec_list *head)
{
    return head->next == head;
}



#endif /* _IEC_LIST_H_ */
